import { useEffect, useRef, useState } from 'react'

import { priceSwitch } from '@/utils/compUtils'

export const RandomCount = ({ startValue, endValue }: any) => {
  const [currentValue, setCurrentValue] = useState(startValue)
  const countRef = useRef(currentValue)

  const countTimerRef = useRef<any>(null)
  const [timeList, setTimeList] = useState<number[]>([])
  useEffect(() => {
    // 更新ref的值为最新状态
    countRef.current = currentValue
  })
  //洗牌算法
  //   function shuffleArray(array: any[]) {
  //     for (let i = array.length - 1; i > 0; i--) {
  //       const j = Math.floor(Math.random() * (i + 1))
  //       ;[array[i], array[j]] = [array[j], array[i]]
  //     }
  //     return array
  //   }
  //   //获取等分随机时间数组
  //   const generateArray = (x: number, totalSum: number) => {
  //     let arr = []
  //     let remainingSum = totalSum

  //     // 生成x-1随机数
  //     for (let i = 0; i < x - 1; i++) {
  //       const maxPossibleValue = remainingSum - (x - 1 - i) //确保最后一个值足以完成总和
  //       const randomNumber = Math.floor(Math.random() * maxPossibleValue) + 1
  //       arr.push(randomNumber)
  //       remainingSum -= randomNumber
  //     }

  //     //最后一个元素确保总和等于300
  //     arr.push(remainingSum)

  //     // 打乱数组以随机化顺序F
  //     arr = shuffleArray(arr)

  //     return arr
  //   }
  function generateArray(x: number, totalSum: number) {
    // 初始化数组
    const arr = []
    let remainingSum = totalSum || 300

    // 生成 x 个元素
    for (let i = 0; i < x; i++) {
      // 确保剩余和不会小于剩余元素个数
      const maxPossibleValue = Math.floor(remainingSum / (x - i))
      // 生成随机数，范围在1到最大可能值之间
      let randomValue = Math.floor(Math.random() * (maxPossibleValue - 1)) + 1
      // 确保最后一个元素时，剩余和正好等于剩余元素个数
      if (i === x - 1) {
        randomValue = remainingSum
      } else {
        remainingSum -= randomValue
      }
      arr.push(randomValue)
    }

    return arr
  }

  const executionTime = (n: number) => {
    const s = timeList[n]
    if (currentValue == endValue) {
      clearTimeout(countTimerRef.current)
      return
    } else {
      countTimerRef.current = setTimeout(() => {
        let val = countRef.current
        if (
          startValue > endValue &&
          countRef.current > endValue &&
          countRef.current > 0
        ) {
          val = countRef.current - 1
        } else if (startValue < endValue && countRef.current < endValue) {
          val = countRef.current + 1
        }
        setCurrentValue(val)
        if (val == endValue) {
          clearTimeout(countTimerRef.current)
        } else {
          n++
          executionTime(n)
        }
      }, s * 1000)
    }
  }
  useEffect(() => {
    if (timeList && timeList.length > 0) {
      //   console.log("====timeList===", timeList)
      executionTime(0)
    }
  }, [timeList])

  useEffect(() => {
    const qj = Math.abs(endValue - startValue) //需要加减的几个数
    let times: number[] = []
    if (qj > 1) {
      times = generateArray(qj, 280) //生成280秒内的随机数
    } else if (qj == 1) {
      times = [...Array(1)].map(() => Math.floor(Math.random() * 60) + 1) //生成60秒内的随机数
    }
    setTimeList(times)
  }, [endValue])

  useEffect(() => {
    return () => {
      //销毁定时器
      if (countTimerRef.current) {
        setCurrentValue(0)
        clearTimeout(countTimerRef.current)
      }
    }
  }, [])

  return <div>{priceSwitch(currentValue)}</div>
}
